<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>API</title>
</head>
<body>
  <script>
    // Promise 的执行规则
    const p1 = new Promise((resolve, reject) => {
      console.log('p1-111'); // 第一个输出
      resolve('p1-222');
    });
    p1.then(value => {
      console.log('p1 value 输出:', value); // 第三个输出
    }, reason => {});
    console.log('p1-333'); // 第二个输出
    // 上述输出 p1-111 p1-333 p1-222，Promise 的回调在同步代码执行后输出

    // .catch() 方法：用来捕获 Promise 对象抛出的错误或指定执行失败的回调
    const p2 = new Promise((resolve, reject) => {
      // 抛出错误
      throw 'p2 出错啦';
    }).catch(reason => {
      console.log('p2 catch 输出:', reason); // 控制台打印 “p2 出错啦”
    });
    const p3 = new Promise((resolve, reject) => {
      reject('p3 执行失败');
    }).catch(reason => { 
      console.log('p3 catch 输出:', reason); // 控制台打印 “p3 执行失败”
    });

    // Promise.resolve() 方法：返回一个执行成功的 Promise 对象，结果为内部的参数
    const p4 = Promise.resolve('p4 执行成功');
    p4.then(value => {
      console.log('p4 value 输出:', value); // 控制台打印 “执行成功”
    });
    console.log('p4:', p4); // p4 状态为[成功]，结果为 p4 执行成功
    const p5 = Promise.resolve(Promise.reject('p5 出错啦')); // 此情况输出的是内部 Promise 的结果
    p5.catch(reason => {
      console.log('p5 catch 输出:', reason); // 控制台打印 “p5 出错啦”
    });
    console.log('p5:', p5); // p5 状态为[失败]，结果为 p5 出错啦
    // 总结：1、内部传入非 Promise 对象，则返回成功的 Promise 对象，结果为传入的值
    //      2、内部传入成功的 Promise 对象，则返回成功的 Promise 对象，结果为内部 Promise 对象成功的返回值
    //      3、内部传入失败的 Promise 对象。则返回失败的 Promise 对象，结果为内部 Promise 对象失败的返回值
    
    // Promise.reject() 方法：返回一个执行失败的 Promsie 对象，结果为内部的参数
    const p6 = Promise.reject('p6 出错啦');
    p6.catch(reason => {
      console.log('p6 catch 输出:', reason);
    });
    console.log('p6:', p6); // p6 状态为[失败]，结果为 p6 出错啦
    const p7 = Promise.reject(Promise.resolve('p7 执行成功'));
    p7.catch(reason => {
      console.log('p7 catch 输出:', reason); // p7 内部返回 Promise 状态为[成功]，结果为 p7 执行成功
    });
    console.log('p7:', p7); // p7 状态为[失败]，结果为内部的 Promise 对象
    // 总结：1、内部传入非 Promise 对象，则返回失败的 Promise 对象，结果为传入的值
    //      2、内部传入 Promise 对象，则返回失败的 Promise 对象，结果为内部 Promise 对象
  </script>
</body>
</html>
<!-- 

 打印结果： 
p1-111
7-API.html:18 p1-333
7-API.html:39 p4: Promise
7-API.html:44 p5: Promise
7-API.html:54 p6: Promise
7-API.html:59 p7: Promise
7-API.html:16 p1 value 输出: p1-222
7-API.html:26 p2 catch 输出: p2 出错啦
7-API.html:31 p3 catch 输出: p3 执行失败
7-API.html:37 p4 value 输出: p4 执行成功
7-API.html:42 p5 catch 输出: p5 出错啦
7-API.html:52 p6 catch 输出: p6 出错啦
7-API.html:57 p7 catch 输出: Promise 
-->